﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ConfeccionesJR.Entites;
using ConfeccionesJR.BussinesLogic;
using Microsoft.Practices.Unity;

namespace ConfeccionesJR.UI
{
    public partial class frmMttProforma : Form
    {
        [Dependency]
        public IProformaBL proformaBL { get; set; }

        [Dependency]
        public IProductoBL productoBL { get; set; }

        [Dependency]
        public IClienteBL clienteBL { get; set; }

        [Dependency]
        public IDetalleProformaBL detalleProformaBL { get; set; }

        public frmMttProforma()
        {
            InitializeComponent();
            this.BuildUp();
            //Combo.DataSource = unidaMedidaBL.GetAllFromUnidaMedidas();
        }

        bool IsNew = true;

        public void AddProforma()
        {
            pROFORMABindingSource.AddNew();
        }

        public void Editar(int id)
        {
            IsNew = false;

            var _proforma = proformaBL.GetFromProformaByID(id);
            pROFORMABindingSource.DataSource = _proforma;

            _proforma.CLIENTE = clienteBL.GetFromClienteById(_proforma.clienteId);

            lblAyuda.Visible = false;
        }

        private void FrmMttProforma_Load(object sender, EventArgs e)
        {
            Calculartotal();
            lblAyuda.Visible = false;
            lblNewProducto.Visible = false;
            pRODUCTOBindingSource.DataSource = productoBL.GetAllFromProducto();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            var _proforma = pROFORMABindingSource.Current as PROFORMA;

            var msg = "ERROR";

            if (_proforma != null)
            {
                _proforma.CondicionPago = condicionPagoTextBox.Text.ToUpper();
                _proforma.Vigencia = vigenciaTextBox.Text.ToUpper();
                _proforma.TiempoEntrega = tiempoEntregaTextBox.Text.ToUpper();

                #region IsNew

                if (IsNew)
                {
                    try
                    {
                        proformaBL.AddProforma(_proforma);
                        MessageBox.Show("Registro Correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);

                        var rpt = MessageBox.Show(this, string.Format("Desea imprimir la Proforma"),
                            "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        if (rpt == DialogResult.Yes)
                        {
                            frmRepProforma frm = new frmRepProforma();
                            frm.ObtenerId(_proforma.Id);
                            frm.ShowDialog();
                        }
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }
                }
                #endregion
                #region IsEdit
                else
                {
                    try
                    {
                        proformaBL.UpdateProforma(_proforma);
                        Editar(_proforma.Id);
                        MessageBox.Show("Modificación Correcta", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                    catch (Exception ex)
                    {
                        msg = ex.Message;
                        MessageBox.Show(msg, "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    }

                }
                #endregion
            }
        }

        private void btnBuscar_Click(object sender, EventArgs e)
        {
            CargaProductos();
        }

        private void txtCriterio_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                CargaProductos();
            }
        }

        private void CargaProductos()
        {
            List<PRODUCTO> existenProductos;

            var criterio = txtCriterio.Text == string.Empty ? null : txtCriterio.Text;

            existenProductos = productoBL.GetFromProductoByDescripcion(criterio);

            pRODUCTOBindingSource.DataSource = existenProductos;

            if (existenProductos.Count <= 0)
            {
                lblNewProducto.Visible = true;
            }
            else
            {
                lblNewProducto.Visible = false;
            }
        }

        private void Calculartotal()
        {
            var proforma = pROFORMABindingSource.Current as PROFORMA;
            if (proforma != null)
            {
                var tot = proforma.DETALLEPROFORMAs.Sum(dv => dv.Monto);
                proforma.Total = Math.Round(tot, 2);
                pROFORMABindingSource.ResetBindings(true);
            }
        }

        private void AgregarProducto()
        {
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var currenteProforma = pROFORMABindingSource.Current as PROFORMA;

            if (producto.Stock > 0)
            {
                #region  AddDetalle
                var detalle = new DETALLEPROFORMA();
                detalle = new DETALLEPROFORMA
                {
                    proformaId = currenteProforma.Id,
                    Producto = producto,
                    productoId = producto.Id,
                    Cantidad = 1,
                    PrecioUnit = producto.Precio,
                };
                #endregion
                var existe = currenteProforma.DETALLEPROFORMAs.Where(dv => dv.Producto.Id.Equals(producto.Id)).SingleOrDefault();
                if (existe == null)
                {
                    currenteProforma.DETALLEPROFORMAs.Add(detalle);
                    var tot = currenteProforma.DETALLEPROFORMAs.Sum(dv => dv.Monto);
                    currenteProforma.Total = Math.Round(tot, 2);
                }
                else
                {
                    var rpt = MessageBox.Show(this, string.Format("El Producto {0} " + " ya se encuentra en la proforma\n Desea agregar otro?", producto.Descripcion),
                    "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                    if (rpt == DialogResult.Yes)
                    {
                        if (existe.Cantidad + 1 <= producto.Stock)
                        {
                            existe.Cantidad++;
                            var tot = currenteProforma.DETALLEPROFORMAs.Sum(dv => dv.Monto);
                            currenteProforma.Total = Math.Round(tot, 2);
                            CalcularTotal();
                        }
                        else
                        {
                            MessageBox.Show("La cantidad supera el stock disponible.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        }
                    }
                }
                pROFORMABindingSource.ResetBindings(true);
                dETALLEPROFORMAsBindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show("La cantidad supera el stock disponible.", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }

        }

        private void btnQuitar_Click(object sender, EventArgs e)
        {
            QuitarProducto();
        }

        private void QuitarProducto()
        {
            var CurrentProforma = pROFORMABindingSource.Current as PROFORMA;
            var detalle = dETALLEPROFORMAsBindingSource.Current as DETALLEPROFORMA;

            if (CurrentProforma != null)
            {
                var rpt = MessageBox.Show(this, string.Format("El producto: {0}," + "ya se encuentra en le pedido desea Quitar?", detalle.Producto.Descripcion),
                   "Quitar Producto", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (rpt == DialogResult.Yes)
                {
                    if (detalle.productoId > 0)
                    {
                        detalleProformaBL.DeleteDetalleProforma(detalle.productoId, CurrentProforma.Id);
                    }
                    dETALLEPROFORMAsBindingSource.RemoveCurrent();
                    Calculartotal();

                }
                pROFORMABindingSource.ResetBindings(true);
                dETALLEPROFORMAsBindingSource.ResetBindings(true);
            }
            else
            {
                MessageBox.Show("Debe seleccionar un detalle para poder quitar de la lista");
            }
        }

        private void dniRucTextBox_TextChanged(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void dniRucTextBox_Leave(object sender, EventArgs e)
        {
            //lblAyuda.Visible = false;

            //if (dniRucTextBox.Text.Length == 0)
            //{
            //    MessageBox.Show("Debe Ingresar un número de RUC/DNI", "Mensaje", MessageBoxButtons.OK);
            //}
            //else
            //    if (dniRucTextBox.Text.Length > 6)
            //    {
            //        CargarCliente();
            //    }
            //    else MessageBox.Show("Longitud de RUC/DNI incorrecta", "Mensaje", MessageBoxButtons.OK);
        }

        private void dniRucTextBox_Click(object sender, EventArgs e)
        {
            if (IsNew)
            {
                lblAyuda.Visible = true;
            }
            else
                lblAyuda.Visible = false;
        }

        private void dniRucTextBox_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                if (dniRucTextBox.Text.Length == 0)
                {
                    MessageBox.Show("Debe Ingresar un número de RUC/DNI", "Mensaje", MessageBoxButtons.OK);
                }
                else
                    if (dniRucTextBox.Text.Length > 6)
                    {
                        CargarCliente();
                    }
                    else MessageBox.Show("Longitud de RUC/DNI incorrecta", "Mensaje", MessageBoxButtons.OK);
            }

            #region BuscarCliente
            if (e.KeyCode == Keys.F1)
            {
                frmCliente frm = new frmCliente();
                frm.Clien = true;
                frm.ShowDialog();
                if (frm.CurrentCliente != null)
                {
                    var _proforma = pROFORMABindingSource.Current as PROFORMA;
                    _proforma.CLIENTE = frm.CurrentCliente;
                    _proforma.clienteId = frm.CurrentCliente.Id;

                    pROFORMABindingSource.ResetBindings(true);
                }

            }
            #endregion
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            CargarCliente();
        }

        private void CargarCliente()
        {
            var proforma = pROFORMABindingSource.Current as PROFORMA;

            if (dniRucTextBox.Text.Length == 0)
            {
                MessageBox.Show("Debe Ingresar un número de RUC/DNI", "Mensaje", MessageBoxButtons.OK);
            }
            else
                if (dniRucTextBox.Text.Length > 6)
                {
                    var cliente = clienteBL.GetFromOneClienteByDniRuc(dniRucTextBox.Text);

                    if (cliente != null)
                    {
                        proforma.CLIENTE = cliente;
                        proforma.clienteId = cliente.Id;

                        pROFORMABindingSource.ResetBindings(true);
                    }
                    else
                    {
                        var rpt = MessageBox.Show(this, string.Format("Cliente no existente ¿Desea registrarlo?"),
                            "Mensaje", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                        if (rpt == DialogResult.Yes)
                        {
                            var frm = new frmMttoCliente();
                            frm.AddCliente();
                            frm.ShowDialog();
                            CargarCliente();
                        }
                        if (rpt == DialogResult.No)
                        {
                            proforma.CLIENTE = null;
                            proforma.clienteId = 0;
                            pROFORMABindingSource.ResetBindings(true);
                        }
                    }
                }
                else
                {
                    MessageBox.Show("Longitud de placa incorrecta", "Mensaje", MessageBoxButtons.OK);
                    proforma.CLIENTE = null;
                    proforma.clienteId = 0;
                    pROFORMABindingSource.ResetBindings(true);
                }
        }

        private void pRODUCTODataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (this.pRODUCTODataGridView.Columns[e.ColumnIndex].Name.Equals("Agregar"))
            {
                AgregarProducto();
            }
        }

        private void pRODUCTODataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            AgregarProducto();
        }

        private void CalcularTotal()
        {
            var proForma = pROFORMABindingSource.Current as PROFORMA;
            if (proForma != null)
            {
                //proForma.Total = proForma.DETALLEPROFORMAs.Sum(dv => dv.Monto);
                var tot = proForma.DETALLEPROFORMAs.Sum(dv => dv.Monto);
                proForma.Total = Math.Round(tot, 2);
                pROFORMABindingSource.ResetBindings(true);
            }
        }

        private void TxtProductoDesc_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                BuscarProductoEnDetalle();
            }
        }

        private void btnBuscarDetalle_Click(object sender, EventArgs e)
        {
            BuscarProductoEnDetalle();
        }

        private void BuscarProductoEnDetalle()
        {

            List<DETALLEPROFORMA> listatemp = new List<DETALLEPROFORMA>();
            var producto = pRODUCTOBindingSource.Current as PRODUCTO;
            var _proforma = pROFORMABindingSource.Current as PROFORMA;

            if (_proforma != null)
            {
                if (TxtProductoDesc.Text != null && TxtProductoDesc.Text != "" && TxtProductoDesc.Text != string.Empty)
                {
                    foreach (var item in _proforma.DETALLEPROFORMAs)
                    {
                        var descMayus = (TxtProductoDesc.Text).ToUpper();
                        var itemPRO = (item.Producto.Descripcion).ToUpper();
                        var a = itemPRO.Contains(descMayus);
                        if (a == true)
                        {
                            listatemp.Add(item);
                        }
                    }
                    dETALLEPROFORMAsBindingSource.DataSource = listatemp;
                    dETALLEPROFORMAsBindingSource.ResetBindings(true);
                }
                else
                {
                    dETALLEPROFORMAsBindingSource.DataSource = _proforma.DETALLEPROFORMAs;
                    dETALLEPROFORMAsBindingSource.ResetBindings(true);
                }
            }
            else
                MessageBox.Show("No existen productos en el detalle", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void txtCriterio_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void TxtProductoDesc_KeyPress(object sender, KeyPressEventArgs e)
        {
            var slash = Convert.ToString("/");
            var coma = Convert.ToString(",");
            var guion = Convert.ToString("-");
            var punto = Convert.ToString(".");

            string cadena = slash + coma + guion + punto + (char)8;

            if (Char.IsLetter(e.KeyChar) || cadena.Contains(e.KeyChar) || (char.IsNumber(e.KeyChar)))
            {
                e.Handled = false;
            }
            else if (Char.IsControl(e.KeyChar))
            {
                e.Handled = false;
            }
            else if (Char.IsSeparator(e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void detalleProformaDataGridView_CellMouseDoubleClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            QuitarProducto();
        }

        private void detalleProformaDataGridView_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            MessageBox.Show("Asegurese de ingresar un valor correcto", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }

        private void detalleProformaDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 || e.ColumnIndex == 2 )
            {
                var producto = new PRODUCTO();
                var detalle = dETALLEPROFORMAsBindingSource.Current as DETALLEPROFORMA;

                if (detalle != null)
                {
                    producto = productoBL.GetFromProductoById(detalle.productoId);
                    if (detalle.Cantidad <= 0)
                    {
                        MessageBox.Show("La cantidad debe ser mayor a 0", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        detalle.Cantidad = 1;
                    }
                    else
                    {
                        if (detalle.Cantidad > producto.Stock)
                        {
                            MessageBox.Show("La cantidad supera el stock disponible", "Mensaje", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            detalle.Cantidad = producto.Stock;
                        }
                    }
                    CalcularTotal();
                }
            }
        }

        private void detalleProformaDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Delete)
            {
                QuitarProducto();
            }
        }

        private void detalleProformaDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            var _detalle = dETALLEPROFORMAsBindingSource.Current as DETALLEPROFORMA;

            if (this.detalleProformaDataGridView.Columns[e.ColumnIndex].Name.Equals("Quitar"))
            {
                QuitarProducto();
            }
        }

        

        

        
    }
}